home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / programer2 / pari2 / pari / c / gen1 < prev    next >
Text File  |  1991-11-28  |  45KB  |  1,967 lines

  1. /********************************************************************/
  2. /********************************************************************/
  3. /**                                                                **/
  4. /**                +++++++++++++++++++++++++++++++                 **/
  5. /**                +                             +                 **/
  6. /**                +    OPERATIONS GENERIQUES    +                 **/
  7. /**                +      (premiere partie)      +                 **/
  8. /**                +                             +                 **/
  9. /**                +     copyright Babe Cool     +                 **/
  10. /**                +                             +                 **/
  11. /**                +++++++++++++++++++++++++++++++                 **/
  12. /**                                                                **/
  13. /**                                                                **/
  14. /********************************************************************/
  15. /********************************************************************/
  16.  
  17. # include "genpari.h"
  18.  
  19. /*******************************************************************/
  20. /*******************************************************************/
  21. /*                                                                 */
  22. /*                 LISTE DES TYPES GENERIQUES                      */
  23. /*                 ~~~~~~~~~~~~~~~~~~~~~~~~~~                      */
  24. /*                                                                 */
  25. /*  1  :entier long     [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  26. /*  2  :reel            [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  27. /*  3  :entier modulo   [ code ] [ mod  ] [ entier modulo ]        */
  28. /*  4  :fraction        [ code ] [ num. ] [ den. ]                 */
  29. /*  5  :nfraction       [ code ] [ num. ] [ den. ]                 */
  30. /*  6  :complexe        [ code ] [ reel ] [ imag ]                 */
  31. /*  7  :p-adique        [ cod1 ] [ cod2 ] [ p ] [ p^r ] [ entier]  */
  32. /*  8  :quadrat         [ cod1 ] [ mod  ] [ reel ] [ imag ]        */
  33. /*  9  :poly mod        [ code ] [ mod  ] [ polynome  mod ]        */
  34. /* --------------------------------------------------------------- */
  35. /*  10 :polynome        [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  36. /*  11 :serie           [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  37. /*  13 :fr.rat          [ code ] [ num. ] [ den. ]                 */
  38. /*  14 :n.fr.rat        [ code ] [ num. ] [ den. ]                 */
  39. /*  15 :formqre         [ code ] [  a  ] [  b  ] [  c  ] [ del ]   */
  40. /*  16 :formqim         [ code ] [  a   ] [  b   ] [  c   ]        */
  41. /*  17 :vecteur ligne   [ code ] [  x1  ] ... [  xl  ]             */
  42. /*  18 :vecteur colonne [ code ] [  x1  ] ... [  xl  ]             */
  43. /*  19 :matrice         [ code ] [ col1 ] ... [ coll ]             */
  44. /*                                                                 */
  45. /*******************************************************************/
  46. /*******************************************************************/
  47.  
  48. /********************************************************************/
  49. /********************************************************************/
  50. /**                                                                **/
  51. /**                       ADDITION GENERALE                        **/
  52. /**                                                                **/
  53. /********************************************************************/
  54. /********************************************************************/
  55.  
  56. GEN   gadd(x,y)
  57.      
  58.      GEN   x,y;
  59.      
  60. {
  61.   long  lx,ly,tx,ty,i,j,k,lz,e,l,f,tz,vx,vy;
  62.   long  tetpil,l1,a1,a2,r1,r2,d,r,l2,co;
  63.   GEN z,p1,p2,p3,p4,p;
  64.   
  65.   tx=typ(x);ty=typ(y);vx=gvar(x);vy=gvar(y);
  66.   
  67.   if ((vx<vy)||((vx==vy)&&(tx>ty)))
  68.     {
  69.       p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;
  70.       tz=vx;vx=vy;vy=tz;
  71.     }
  72.   lx=lg(x);ly=lg(y);
  73.   
  74.   if (ty<10)
  75.     {
  76.       switch(tx)
  77.     {
  78.     case 1 : switch(ty)
  79.       {
  80.       case 1 :
  81.         
  82.       case 2 : z=mpadd(x,y);break;
  83.         
  84.       case 3 : z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  85.         l=avma;
  86.         p1=addii(x,y[2]);
  87.         tetpil=avma;
  88.         p2=modii(p1,y[1]);
  89.         z[2]=lpile(l,tetpil,p2);
  90.         break;
  91.         
  92.       case 4 :
  93.         
  94.       case 5 : z=cgetg(ly,ty);l=avma;
  95.         p1=mulii(y[2],x);
  96.         tetpil=avma;
  97.         p2=addii(p1,y[1]);
  98.         z[1]=lpile(l,tetpil,p2);
  99.         z[2]=lcopy(y[2]);
  100.         break;
  101.         
  102.       case 6 : z=cgetg(ly,ty);
  103.         z[1]=ladd(x,y[1]);
  104.         z[2]=lcopy(y[2]);
  105.         break;
  106.         
  107.       case 7 : z=gaddpex(x,y);break;
  108.         
  109.       case 8 : z=cgetg(ly,ty);
  110.         z[2]=ladd(x,y[2]);
  111.         z[3]=lcopy(y[3]);
  112.         z[1]=copyifstack(y[1]);
  113.         break;
  114.         
  115.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  116.         z[1]=copyifstack(y[1]);
  117.         break;
  118.         
  119.       default: err(gadder1);
  120.         
  121.       } break;
  122.       
  123.     case 2 : switch(ty)
  124.       {
  125.       case 2 : z=mpadd(x,y);break;
  126.         
  127.       case 3 : err(gadder2);
  128.         
  129.       case 4 :
  130.         
  131.       case 5 :
  132.         if(signe(y[1]))
  133.           {
  134.         if(gcmp0(x))
  135.           {
  136.             lx=(expi(y[1])-expi(y[2])-expo(x))>>5;
  137.             if(lx<0) lx=0;
  138.             lx+=3;z=cgetr(lx);diviiz(y[1],y[2],z);
  139.           }
  140.         else
  141.           {
  142.             l=avma;z=addir(y[1],mulir(y[2],x));tetpil=avma;
  143.             z=gerepile(l,tetpil,divri(z,y[2]));
  144.           }
  145.               }    
  146.         else z=gcopy(x);
  147.         break;
  148.         
  149.       case 6 : z=cgetg(ly,ty);
  150.         z[1]=ladd(x,y[1]);
  151.         z[2]=lcopy(y[2]);
  152.         break;
  153.         
  154.       case 7 : err(gadder2);
  155.           case 8 : if(gcmp0(y)) z=gcopy(x);
  156.       else
  157.         {
  158.           l=avma;e=gexpo(y)-expo(x);
  159.           if(e<0) e=0;
  160.           p1=co8(y,lx+(e>>5));tetpil=avma;
  161.           z=gerepile(l,tetpil,gadd(p1,x));
  162.         }
  163.         break;
  164.         
  165.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  166.         z[1]=copyifstack(y[1]);
  167.         break;
  168.         
  169.       default: err(gadder1);
  170.         
  171.       } break;
  172.       
  173.     case 3 : switch(ty)
  174.       {
  175.       case 3 : z=cgetg(ly,ty);
  176.         if(gegal(x[1],y[1]))
  177.           z[1]=copyifstack(x[1]);
  178.         else z[1]=lmppgcd(x[1],y[1]);
  179.         l=avma;p1=addii(x[2],y[2]);tetpil=avma;
  180.         z[2]=lpile(l,tetpil,modii(p1,z[1]));
  181.         break;
  182.         
  183.       case 4 :
  184.         
  185.       case 5 : z=cgetg(3,3);
  186.         z[1]=copyifstack(x[1]);
  187.         z[2]=lgeti(lgef(x[1]));
  188.         gaffect(y,z);gaddz(z,x,z);
  189.         break;
  190.         
  191.       case 6 : z=cgetg(ly,ty);z[2]=lcopy(y[2]);z[1]=ladd(x,y[1]);break;
  192.         
  193.       case 7 : l=avma;p1=cgetg(3,3);p1[1]=x[1];p1[2]=lgeti(lgef(x[1]));
  194.         gaffect(y,p1);tetpil=avma;z=gerepile(l,tetpil,gadd(p1,x));
  195.         break;
  196.         
  197.       case 8 : z=cgetg(ly,ty);z[1]=copyifstack(y[1]);z[3]=lcopy(y[3]);
  198.         z[2]=ladd(x,y[2]);break;
  199.         
  200.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  201.         z[1]=copyifstack(y[1]);
  202.         break;
  203.         
  204.       default: err(gadder1);
  205.         
  206.       } break;
  207.       
  208.     case 4 :
  209.       
  210.     case 5 : switch (ty)
  211.       {
  212.       case 4 :
  213.       case 5 : if ((tx+ty)==8) tz=4;else tz=5;
  214.         z=cgetg(ly,tz);l=avma;
  215.         p1=mulii(x[1],y[2]);
  216.         p2=mulii(x[2],y[1]);
  217.         tetpil=avma;
  218.         p3=addii(p1,p2);
  219.         z[1]=lpile(l,tetpil,p3);
  220.         z[2]=lmulii(x[2],y[2]);
  221.         if (tz==4) gredsp(&z);
  222.         break;
  223.       case 6 : z=cgetg(ly,ty);
  224.         z[1]=ladd(y[1],x);
  225.         z[2]=lcopy(y[2]);
  226.         break;
  227.       case 7 : z=gaddpex(x,y);break;
  228.       case 8 : z=cgetg(ly,ty);
  229.         z[2]=ladd(y[2],x);
  230.         z[3]=lcopy(y[3]);
  231.         z[1]=lcopy(y[1]);
  232.         break;
  233.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  234.         z[1]=copyifstack(y[1]);
  235.         break;
  236.         
  237.       default: err(gadder1);
  238.       }
  239.       break;
  240.       
  241.     case 6 : switch(ty)
  242.       {
  243.       case 6 : z=cgetg(ly,ty);
  244.         z[1]=ladd(x[1],y[1]);
  245.         z[2]=ladd(x[2],y[2]);
  246.         break;
  247.       case 7 :
  248.         if(krosg(-1,y[2])== -1)
  249.           {
  250.         z=cgetg(3,6);z[1]=ladd(x[1],y);
  251.         z[2]=lcopy(x[2]);
  252.           }
  253.         else
  254.           {
  255.         l=avma;
  256.         p1=cvtop(x,y[2],signe(y[4])?(valp(y)+precp(y)):valp(y)+1);
  257.         tetpil=avma;z=gerepile(l,tetpil,gadd(p1,y));
  258.           }
  259.         break;
  260.       case 8 : lx=precision(x);if(!lx) err(gadder12);
  261.         if(gcmp0(y)) z=gcopy(x);
  262.         else
  263.           {
  264.         l=avma;e=gexpo(y)-gexpo(x);
  265.         if(e<0) e=0;
  266.         p1=co8(y,lx+(e>>5));tetpil=avma;
  267.         z=gerepile(l,tetpil,gadd(p1,x));
  268.           }
  269.         break;
  270.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  271.         z[1]=copyifstack(y[1]);
  272.         break;
  273.         
  274.       default: err(gadder12);
  275.       }
  276.       break;
  277.       
  278.     case 7 : switch(ty)
  279.       {
  280.       case 7 :
  281.         p=(GEN)(x[2]);
  282.         if(cmpii(p,y[2])) err(gadder15);
  283.         a1=valp(x);a2=valp(y);e=a1;d=a2-a1;
  284.         if(a2<a1)
  285.           {
  286.         p1=x;x=y;y=p1;e=a2;d= -d;
  287.           }
  288.         r1=precp(x);r2=precp(y);
  289.         if(d)
  290.           {
  291.         l=avma;p1=gpuigs(p,d);tetpil=avma;
  292.         z=cgetg(5,7);z[2]=(long)p;r=d+r2;
  293.         if(r1<=r)
  294.           {
  295.             r=r1;z[3]=lcopy(x[3]);
  296.           }
  297.         else z[3]=lmul(p1,y[3]);
  298.         setprecp(z,r);z[4]=lgeti(lgef(z[3]));
  299.         l2=avma;p1=mulii(p1,y[4]);
  300.         modiiz(addii(p1,x[4]),z[3],z[4]);avma=l2;
  301.         setvalp(z,e); z=gerepile(l,tetpil,z);
  302.           }
  303.         else
  304.           {
  305.         z=cgetg(5,7);l=avma;
  306.         p1=addii(x[4],y[4]);
  307.         z[2]=(long)p;
  308.         r=r1;if(r2<r1)
  309.           {r=r2;p2=x;x=y;y=p2;}
  310.         if(gcmp0(p1)||((co=pvaluation(p1,p,&p2))>=r))
  311.           {
  312.             avma=l;setprecp(z,0);z[3]=un;
  313.             setvalp(z,e+r);
  314.             z[4]=lgeti(lgef(x[3]));
  315.             affsi(0,z[4]);
  316.           }
  317.         else
  318.           {
  319.             if(co)
  320.               {
  321.             p1=gpuigs(p,co);tetpil=avma;
  322.             z[3]=ldivii(x[3],p1);
  323.             r-=co;setprecp(z,r);setvalp(z,e+co);
  324.             l2=lgef(z[3]);z[4]=lgeti(l2);
  325.             modiiz(p2,z[3],z[4]);
  326.             gerepile(l,tetpil,1);
  327.               }
  328.             else
  329.               {
  330.             tetpil=avma;z[4]=lgeti(lgef(x[3]));
  331.             modiiz(p1,x[3],z[4]);
  332.             z[4]=lpile(l,tetpil,z[4]);
  333.             z[3]=lcopy(x[3]);
  334.             setprecp(z,r);setvalp(z,e);
  335.               }
  336.           }
  337.           }
  338.         break;
  339.         
  340.       case 8 :
  341.         if(kro8(y,x[2])== -1)
  342.           {
  343.         z=cgetg(4,8);z[1]=copyifstack(y[1]);
  344.         z[2]=ladd(y[2],x);
  345.         z[3]=lcopy(y[3]);
  346.           }
  347.         else
  348.           {
  349.         l=avma;
  350.         p1=cvtop(y,x[2],signe(x[4])?(valp(x)+precp(x)):valp(x)+1);
  351.         tetpil=avma;
  352.         z=gerepile(l,tetpil,gadd(p1,x));
  353.           } break;
  354.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  355.         z[1]=copyifstack(y[1]);
  356.         break;
  357.       default: err(gadder1);
  358.       }
  359.       break;
  360.     case 8 : switch(ty)
  361.       {
  362.       case 8 :
  363.         if (!gegal(x[1],y[1])) err(gadder13);
  364.         z=cgetg(ly,ty);z[2]=ladd(x[2],y[2]);z[3]=ladd(x[3],y[3]);
  365.         z[1]=copyifstack(y[1]);break;
  366.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  367.         z[1]=copyifstack(y[1]);
  368.         break;
  369.       default: err(gadder1);
  370.       }
  371.       break;
  372.         case 9 : z=cgetg(lx,tx);
  373.       if(gegal(x[1],y[1]))
  374.         z[1]=copyifstack(x[1]);
  375.       else z[1]=lgcd(x[1],y[1]);
  376.       l=avma;p1=gadd(x[2],y[2]);tetpil=avma;
  377.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  378.       break;
  379.         default: if(ty!=9) err(talker,"bug in gadd, please report");
  380.       z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  381.       l=avma;p1=gadd(x,y[2]);tetpil=avma;
  382.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  383.       break;
  384.     }
  385.     }
  386.   else /* ici ty>=10 */
  387.     {
  388.       if(((vx>vy)&&((tx<17)||(ty<17)))||((vx==vy)&&(tx<10)))
  389.     {
  390.       switch(ty)
  391.         {
  392.         case 10: e=lgef(y);
  393.           if(e==2)
  394.         {
  395.           if(isexactzero(x)) {z=cgetg(2,ty);z[1]=2;}
  396.           else
  397.             {
  398.               z=cgetg(3,ty);z[2]=lcopy(x);
  399.               z[1]=(gcmp0(x))?3:0x1000003;
  400.             }
  401.           setvarn(z,vy);
  402.         }
  403.           else
  404.         {
  405.           z=cgetg(e,ty);
  406.           z[2]=ladd(x,y[2]);
  407.           if((e==3)&&(gcmp0(z[2])))
  408.             {z[1]=isexactzero(z[2])?2:3;setvarn(z,vy);}
  409.           else
  410.             {
  411.               z[1]=y[1];for(i=3;i<e;i++) z[i]=lcopy(y[i]);
  412.               normalizepol(&z);
  413.             }
  414.         }
  415.           break;
  416.           
  417.         case 11: e=valp(y);
  418.           if (e<3-ly) z=gcopy(y);
  419.           else
  420.         {
  421.           if (e<0)
  422.             {
  423.               z=cgetg(ly,ty);
  424.               z[2-e]=ladd(x,y[2-e]);
  425.               z[1]=y[1];
  426.               for (i=2;i<=1-e;i++)
  427.             z[i]=lcopy(y[i]);
  428.               for (i=3-e;i<ly;i++)
  429.             z[i]=lcopy(y[i]);
  430.             }
  431.           else
  432.             {
  433.               if (e>0)
  434.             {
  435.               if (gcmp0(x)) z=gcopy(y);
  436.               else
  437.                 {
  438.                   if(gcmp0(y)) lz=e+2;else lz=ly+e;
  439.                   z=cgetg(lz,ty);
  440.                   z[1]=0x1008000;z[2]=lcopy(x);
  441.                   setvarn(z,vy);
  442.                   for (i=3;i<=e+1;i++) z[i]=zero;
  443.                   for (i=e+2;i<lz;i++)
  444.                 z[i]=lcopy(y[i-e]);
  445.                 }
  446.             }
  447.               else
  448.             {
  449.               z=cgetg(ly,ty);l=avma;
  450.               p1=gadd(x,y[2]);
  451.               /*              if (gcmp0(p1)) */
  452.               if(isexactzero(p1))
  453.                 {
  454.                   avma=l;
  455.                   if(ly==3)
  456.                 {z[2]=zero;z[1]=0x8001;}
  457.                   else
  458.                 {
  459.                   i=3;
  460.                   while ((i<ly)&&(gcmp0(y[i]))) i++;
  461.                   if (i==ly)
  462.                     {
  463.                       cgiv(z);z=cgetg(3,ty);z[2]=zero;
  464.                       z[1]=0x7ffe +i;
  465.                     }
  466.                   else
  467.                     {
  468.                       cgiv(z);z=cgetg(ly-i+2,ty);
  469.                       setvalp(z,i-2);setsigne(z,1);
  470.                       for (j=2;j<=ly-i+1;j++)
  471.                     z[j]=lcopy(y[j+i-2]);
  472.                     }
  473.                 }
  474.                 }
  475.               else
  476.                 {
  477.                   z[1]=0x1008000;z[2]=(long)p1;
  478.                   for (i=3;i<ly;i++)
  479.                 z[i]=lcopy(y[i]);
  480.                 }
  481.               setvarn(z,vy);
  482.             }
  483.             }
  484.         }
  485.           break;
  486.           
  487.         case 13: l=avma;z=cgetg(ly,ty);
  488.           z[1]=ladd(gmul(x,y[2]),y[1]);z[2]=y[2];
  489.           tetpil=avma;z=gerepile(l,tetpil,gred(z));
  490.           break;
  491.         case 14: z=cgetg(ly,ty);l=avma;p1=gmul(x,y[2]);tetpil=avma;
  492.           z[1]=lpile(l,tetpil,gadd(p1,y[1]));z[2]=lcopy(y[2]);
  493.           break;
  494.           
  495.         case 15:
  496.         case 16:
  497.         case 17:
  498.         case 18:
  499.         case 19: err(gadder5);
  500.         default: err(gadder1);
  501.         }
  502.     }
  503.       else /* ici ty>=10 et tx>=10 et vx=vy */
  504.     {
  505.       if(tx>ty)
  506.         {p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;}
  507.       switch(tx)
  508.         {
  509.         case 10: switch (ty)
  510.           {
  511.           case 10:
  512.         lx=lgef(x);ly=lgef(y);
  513.         if (ly>lx)
  514.           {p1=x;x=y;y=p1;k=lx;lx=ly;ly=k;}
  515.         z=cgetg(lx,ty);
  516.         for (i=2;i<ly;i++)
  517.           z[i]=ladd(x[i],y[i]);
  518.         for (i=ly;i<lx;i++)
  519.           z[i]=lcopy(x[i]);
  520.         z[1]=x[1];normalizepol(&z);break;      
  521.           case 11:
  522.         if (gcmp0(x)) z=gcopy(y);
  523.         else
  524.           {
  525.             i=signe(y) ? valp(y)+ly-gval(x,vx) : valp(y)+3-gval(x,vx);
  526.             if(i<3) z=gcopy(y);
  527.             else
  528.               {
  529.             l=avma;p1=greffe(x,i);
  530.             tetpil=avma;
  531.             p2=gadd(p1,y);z=gerepile(l,tetpil,p2);
  532.               }
  533.           }
  534.         break;
  535.         
  536.           case 13: l=avma;z=cgetg(ly,ty);
  537.         z[1]=ladd(gmul(x,y[2]),y[1]);z[2]=y[2];
  538.         tetpil=avma;z=gerepile(l,tetpil,gred(z));
  539.         break;
  540.           case 14: z=cgetg(ly,ty);l=avma;p1=gmul(x,y[2]);tetpil=avma;
  541.         z[1]=lpile(l,tetpil,gadd(p1,y[1]));z[2]=lcopy(y[2]);
  542.         break;
  543.           case 15:
  544.           case 16:
  545.           case 17:
  546.           case 18:
  547.           case 19: err(gadder6);
  548.           default: err(gadder1);
  549.           } break;
  550.           
  551.         case 11: switch(ty)
  552.           {
  553.           case 11: e=valp(y)-valp(x);
  554.         if(e<0)
  555.           {
  556.             e= -e;p1=x;x=y;y=p1;
  557.             lz=lx;lx=ly;ly=lz;
  558.           }
  559.         if(gcmp0(x)) z=gcopy(x);
  560.         else
  561.           {
  562.             if(gcmp0(y)) ly=2;
  563.             lz=e+ly;
  564.             if (lx<lz) lz=lx;
  565.             if(e)
  566.               {
  567.             z=cgetg(lz,ty);
  568.             setvalp(z,valp(x));setsigne(z,1);
  569.             if(e<lz-2)
  570.               {
  571.                 for (i=2;i<=e+1;i++) z[i]=lcopy(x[i]);
  572.                 for(i=e+2;i<lz;i++) z[i]=ladd(x[i],y[i-e]);
  573.               }
  574.             else
  575.               for (i=2;i<lz;i++) z[i]=lcopy(x[i]);
  576.               }
  577.             else
  578.               {
  579.             i=2;l=avma;f=1;
  580.             while(f&&(i<lz))
  581.               {
  582.                 avma=l; p1=gadd(x[i],y[i]);
  583.                 f=isexactzero(p1);i++;
  584.                 /*                f=gcmp0(p1);i++; */
  585.               }
  586.             if(f)
  587.               {
  588.                 avma=l;z=cgetg(lz,ty);z[1]=0x7ffe +lz+valp(y);
  589.               }
  590.             else
  591.               {
  592.                 z=cgetg(lz-i+3,ty);
  593.                 setvalp(z,valp(x)+i-3);
  594.                 setsigne(z,1);z[2]=(long)p1;
  595.                 for(j=i;j<lz;j++)
  596.                   z[j-i+3]=ladd(x[j],y[j]);
  597.               }
  598.               }
  599.             setvarn(z,vx);
  600.           }
  601.         break;
  602.         
  603.           case 15:
  604.           case 16:
  605.           case 17:
  606.           case 18:
  607.           case 19: err(gadder7);
  608.           case 13:
  609.           case 14: if(gcmp0(y)) z=gcopy(x);
  610.           else
  611.         {
  612.           e=gval(y,vy);
  613.           if (gcmp0(x)) lz=valp(x)+3-e;
  614.           else lz=lx+valp(x)-e;
  615.           if(lz<3) z=gcopy(x);
  616.           else
  617.             {
  618.               l=avma;
  619.               if(typ(y[2])<10)
  620.             p3=gdiv(y[1],y[2]);
  621.               else
  622.             {
  623.               p2=greffe(y[2],lz);
  624.               p3=gdiv(y[1],p2);
  625.             }
  626.               tetpil=avma;
  627.               p4=gadd(p3,x);z=gerepile(l,tetpil,p4);
  628.             }
  629.         } break;
  630.         
  631.           default: err(gadder1);
  632.         
  633.           } break;
  634.           
  635.         case 13:
  636.         case 14: if(ty>14) err(gadder10);
  637.         else
  638.           {
  639.         if((tx+ty)==26) tz=13;else tz=14;
  640.         l1=avma;z=cgetg(ly,tz);l=avma;
  641.         p1=gmul(x[1],y[2]);
  642.         p2=gmul(x[2],y[1]);
  643.         tetpil=avma;
  644.         p3=gadd(p1,p2);z[1]=lpile(l,tetpil,p3);
  645.         z[2]=lmul(x[2],y[2]);
  646.         if(tz==13)
  647.           {
  648.             tetpil=avma;p1=gred(z);z=gerepile(l1,tetpil,p1);
  649.           }
  650.           }
  651.           break;
  652.           
  653.         case 15:
  654.         case 16: err(gadder9);
  655.         case 17:
  656.         case 18:
  657.         case 19: if((lx!=ly)||(tx!=ty)) err(gadder11);
  658.         else
  659.           {
  660.         z=cgetg(ly,ty);
  661.         for(i=1;i<ly;i++)
  662.           z[i]=ladd(x[i],y[i]);
  663.           }
  664.           break;
  665.           
  666.         default: err(gadder1);
  667.         }
  668.     }
  669.     }
  670.   return z;
  671. }
  672.  
  673. /********************************************************************/
  674. /********************************************************************/
  675. /**                                                                **/
  676. /**                   SOUSTRACTION GENERALE                        **/
  677. /**                                                                **/
  678. /********************************************************************/
  679. /********************************************************************/
  680.  
  681. GEN   gsub(x,y)
  682.      
  683.      GEN   x,y;
  684.      
  685. {
  686.   long    l,tetpil;
  687.   GEN   z,p1,p2;
  688.   
  689.   l=avma;p1=gneg(y);
  690.   tetpil=avma;
  691.   p2=gadd(x,p1);
  692.   z=gerepile(l,tetpil,p2);
  693.   return z;
  694. }
  695.  
  696. /********************************************************************/
  697. /********************************************************************/
  698. /**                                                                **/
  699. /**                 MULTIPLICATION GENERALE                        **/
  700. /**                                                                **/
  701. /********************************************************************/
  702. /********************************************************************/
  703.  
  704. GEN   gmul(x,y)
  705.      
  706.      GEN   x,y;
  707.      
  708. {
  709.   long  tx,ty,tz,lx,ly,dx,dy,i,j;
  710.   long  k,l,l1,l2,tetpil,vx,vy,vfl;
  711.   GEN   z,p1,p2,p3,p4,p5;
  712.   
  713.   tx=typ(x);ty=typ(y);vx=gvar(x);vy=gvar(y);vfl=0;
  714.   if(ty<17)
  715.     {
  716.       if(tx>=17) vfl=1;
  717.       else {if((vx<vy)||((vx==vy)&&(tx>ty))) vfl=1;}
  718.     } 
  719.   if(vfl)
  720.     {
  721.       p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;
  722.       tz=vx;vx=vy;vy=tz;
  723.     }
  724.   lx=lg(x);ly=lg(y);
  725.   
  726.   if (ty<10)
  727.     {
  728.       switch(tx)
  729.     {
  730.     case 1 : switch(ty)
  731.       {
  732.       case 1 :
  733.       case 2 : z=mpmul(x,y);break;
  734.       case 3 : z=cgetg(ly,ty);
  735.         z[1]=copyifstack(y[1]);
  736.         l=avma;
  737.         p1=mulii(x,y[2]);
  738.         tetpil=avma;
  739.         p2=modii(p1,y[1]);
  740.         z[2]=lpile(l,tetpil,p2);
  741.         break;
  742.       case 4 :
  743.       case 5 : z=cgetg(ly,ty);
  744.         z[1]=lmulii(x,y[1]);
  745.         z[2]=lcopy(y[2]);
  746.         if (ty==4) gredsp(&z);
  747.         break;
  748.         
  749.       case 6 : z=cgetg(ly,ty);
  750.         z[1]=lmul(x,y[1]);
  751.         z[2]=lmul(x,y[2]);
  752.         break;
  753.         
  754.       case 7 : if(signe(x))
  755.         {
  756.           l=avma;p1=cgetp(y);gaffect(x,p1); tetpil=avma;
  757.           z=gerepile(l,tetpil,gmul(p1,y));
  758.         }
  759.       else z=gzero;
  760.         break; 
  761.         
  762.       case 8 : z=cgetg(ly,ty);
  763.         z[2]=lmul(x,y[2]);
  764.         z[3]=lmul(x,y[3]);
  765.         z[1]=copyifstack(y[1]);
  766.         break;
  767.         
  768.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  769.         z[1]=copyifstack(y[1]);
  770.         break;
  771.         
  772.       default: err(gmuler1);
  773.       } break;
  774.       
  775.     case 2 : switch(ty)
  776.       {
  777.       case 2 : z=mulrr(x,y);break;
  778.         
  779.       case 3 : err(gmuler2);
  780.         
  781.       case 4 :
  782.         
  783.       case 5 : l=avma;p1=cgetr(lx);
  784.         tetpil=avma;gaffect(y,p1);
  785.         p2=mulrr(p1,x);z=gerepile(l,tetpil,p2);
  786.         break;
  787.         
  788.       case 6 : z=cgetg(ly,ty);
  789.         z[1]=lmul(x,y[1]);
  790.         z[2]=lmul(x,y[2]);
  791.         break;
  792.         
  793.       case 8 : l=avma;p1=co8(y,lx);tetpil=avma;
  794.         z=gerepile(l,tetpil,gmul(p1,x));
  795.         break;
  796.         
  797.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  798.         z[1]=copyifstack(y[1]);
  799.         break;
  800.         
  801.       default: err(gmuler1);
  802.         
  803.       } break;
  804.       
  805.     case 3 : switch(ty)
  806.       {
  807.       case 3 : z=cgetg(ly,ty);
  808.         if(gegal(x[1],y[1]))
  809.           z[1]=copyifstack(x[1]);
  810.         else z[1]=lmppgcd(x[1],y[1]);
  811.         l=avma;p1=mulii(x[2],y[2]);tetpil=avma;
  812.         z[2]=lpile(l,tetpil,modii(p1,z[1]));
  813.         break;
  814.         
  815.       case 4 :
  816.         
  817.       case 5 : z=cgetg(3,3);
  818.         z[1]=copyifstack(x[1]);
  819.         z[2]=lgeti(lgef(x[1]));
  820.         gaffect(y,z);gmulz(z,x,z);
  821.         break;
  822.         
  823.       case 7 : l=avma;p1=cgetg(3,3);p1[1]=x[1];p1[2]=lgeti(lg(x[1]));
  824.         gaffect(y,p1);tetpil=avma;z=gerepile(l,tetpil,gmul(x,p1));
  825.         break;
  826.         
  827.       case 6 : z=cgetg(ly,ty);z[1]=lmul(x,y[1]);z[2]=lmul(x,y[2]);break;
  828.       case 8 : z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  829.         z[2]=lmul(x,y[2]);z[3]=lmul(x,y[3]);
  830.         break;
  831.         
  832.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  833.         z[1]=copyifstack(y[1]);
  834.         break;
  835.         
  836.       default: err(gmuler1);
  837.         
  838.       } break;
  839.       
  840.     case 4 :
  841.       
  842.     case 5 : switch(ty)
  843.       {
  844.       case 4 :
  845.         
  846.       case 5 : if ((tx+ty)==8) tz=4;else tz=5;
  847.         z=cgetg(ly,tz);
  848.         z[1]=lmulii(x[1],y[1]);
  849.         z[2]=lmulii(x[2],y[2]);
  850.         if (tz==4) gredsp(&z);
  851.         break;
  852.         
  853.       case 6 : z=cgetg(ly,ty);
  854.         z[1]=lmul(y[1],x);
  855.         z[2]=lmul(y[2],x);
  856.         break;
  857.         
  858.       case 7 : if(signe(x[1]))
  859.         {
  860.           l=avma;p1=cgetp(y);gaffect(x,p1);
  861.           tetpil=avma;z=gerepile(l,tetpil,gmul(p1,y));
  862.         }
  863.       else z=gzero;
  864.         break;
  865.         
  866.       case 8 : z=cgetg(ly,ty);
  867.         z[2]=lmul(y[2],x);
  868.         z[3]=lmul(y[3],x);
  869.         z[1]=copyifstack(y[1]);
  870.         break;
  871.         
  872.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  873.         z[1]=copyifstack(y[1]);
  874.         break;
  875.         
  876.       default: err(gmuler1);
  877.         
  878.       } break;
  879.       
  880.     case 6 : switch(ty)
  881.       {
  882.       case 6 : z=cgetg(ly,ty);l=avma;
  883.         p1=gmul(x[1],y[1]);
  884.         p2=gmul(x[2],y[2]);
  885.         p3=gadd(x[1],x[2]);
  886.         p4=gadd(y[1],y[2]);
  887.         p5=gmul(p3,p4);
  888.         p3=gadd(p1,p2);
  889.         tetpil=avma;
  890.         z[2]=lsub(p5,p3);
  891.         z[1]=lsub(p1,p2);
  892.         z[1]=lpile(l,tetpil,z[1]);
  893.         break;
  894.         
  895.       case 7 :
  896.         if(krosg(-1,y[2])== -1)
  897.           {
  898.         z=cgetg(3,6);
  899.         z[1]=lmul(x[1],y);
  900.         z[2]=lmul(x[2],y);
  901.           }
  902.         else
  903.           {
  904.         l=avma;
  905.         if(signe(y[4])) p1=cvtop(x,y[2],precp(y));
  906.         else p1=cvtop(x,y[2],(valp(y)>0)?valp(y)+1:1);
  907.         tetpil=avma;z=gerepile(l,tetpil,gmul(p1,y));
  908.           }
  909.         break;
  910.         
  911.       case 8 : lx=precision(x);if(!lx) err(gmuler11);
  912.         l=avma;p1=co8(y,lx);tetpil=avma;
  913.         z=gerepile(l,tetpil,gmul(p1,x));
  914.         break;
  915.         
  916.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  917.         z[1]=copyifstack(y[1]);
  918.         break;
  919.         
  920.       default: err(gmuler11);
  921.         
  922.       } break;
  923.       
  924.     case 7 : switch(ty)
  925.       {
  926.       case 7 :
  927.         if(cmpii(x[2],y[2])) err(gmuler14);
  928.         if(!signe(x[4])) {z=gcopy(x);setvalp(z,valp(x)+valp(y));}
  929.         else
  930.           {
  931.         if(!signe(y[4]))
  932.           {
  933.             z=gcopy(y);setvalp(z,valp(x)+valp(y));
  934.           }
  935.         else
  936.           {
  937.             p1=(precp(x)>precp(y)) ? y : x;
  938.             z=cgetp(p1);l=avma;
  939.             setvalp(z,valp(x)+valp(y));
  940.             modiiz(mulii(x[4],y[4]),p1[3],z[4]);
  941.             avma=l;
  942.           }
  943.           }
  944.         break;
  945.         
  946.       case 8 :
  947.         if(kro8(y,x[2])== -1)
  948.           {
  949.         z=cgetg(4,8);z[1]=copyifstack(y[1]);
  950.         z[2]=lmul(y[2],x);
  951.         z[3]=lmul(y[3],x);
  952.           }
  953.         else
  954.           {
  955.         l=avma;p1=cvtop(y,x[2],signe(x[4])?precp(x):valp(x)+1);
  956.         tetpil=avma;z=gerepile(l,tetpil,gmul(p1,x));
  957.           }
  958.         break;
  959.         
  960.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  961.         z[1]=copyifstack(y[1]);
  962.         break;
  963.         
  964.       default: err(gmuler1);
  965.       }
  966.       break;
  967.       
  968.     case 8 : switch(ty)
  969.       {
  970.       case 8 : if (!gegal(x[1],y[1])) err(gmuler12);
  971.         z=cgetg(ly,ty);
  972.         p1=(GEN)x[1];
  973.         if (gcmp0(p1[3]))
  974.           {
  975.         l=avma;
  976.         p2=gmul(x[2],y[2]);
  977.         p3=gmul(x[3],y[3]);
  978.         p4=gmul(gneg(p1[2]),p3);tetpil=avma;
  979.         z[2]=lpile(l,tetpil,gadd(p4,p2));
  980.         l=avma;
  981.         p2=gmul(x[2],y[3]);
  982.         p3=gmul(x[3],y[2]);
  983.         tetpil=avma;
  984.         z[3]=lpile(l,tetpil,gadd(p2,p3));
  985.         z[1]=copyifstack(y[1]);
  986.           }
  987.         else
  988.           {
  989.         l1=avma;p2=gmul(x[3],y[3]);
  990.         l2=avma;
  991.         p3=gmul(x[2],y[2]);
  992.         p4=gmul(gneg(p1[2]),p2);tetpil=avma;
  993.         z[2]=lpile(l2,tetpil,gadd(p3,p4));
  994.         l=avma;p3=gmul(x[2],y[3]);
  995.         p4=gmul(x[3],y[2]);
  996.         p5=gadd(p4,p3);tetpil=avma;
  997.         z[3]=lpile(l,tetpil,gadd(p5,p2));
  998.         z[1]=copyifstack(y[1]);
  999.         gerepile(l1,l2,z);
  1000.           }
  1001.         break;
  1002.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  1003.         z[1]=copyifstack(y[1]);
  1004.         break;
  1005.         
  1006.       default: err(gmuler1);
  1007.       }      
  1008.       break;
  1009.       
  1010.     case 9 : z=cgetg(lx,tx);
  1011.       if(gegal(x[1],y[1]))
  1012.         z[1]=copyifstack(x[1]);
  1013.       else z[1]=lgcd(x[1],y[1]);
  1014.       l=avma;p1=gmul(x[2],y[2]);tetpil=avma;
  1015.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  1016.       break;
  1017.       
  1018.     default: if(ty!=9) err(talker,"bug in gmul, please report");
  1019.       z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  1020.       l=avma;p1=gmul(x,y[2]);tetpil=avma;
  1021.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  1022.       break;
  1023.     }
  1024.     }
  1025.   else  /* ici ty>=10 */
  1026.     {
  1027.       if(((vx>vy)&&((tx<17)||(ty<17)))||((vx==vy)&&(tx<10))||((ty>=17)&&(tx<17)))
  1028.     {
  1029.       switch(ty)
  1030.         {
  1031.         case 10: z=cgetg(ly,ty);
  1032.           if (isexactzero(x)||isexactzero(y))
  1033.         {z[1]=2;setvarn(z,vy);}
  1034.           else
  1035.         {
  1036.           for (i=2;i<lgef(y);i++)
  1037.             z[i]=lmul(x,y[i]);
  1038.           z[1]=y[1];
  1039.           normalizepol(&z);
  1040.         }
  1041.           break;
  1042.           
  1043.         case 11: if (gcmp0(x))
  1044.           {
  1045.         z=cgetg(3,10);z[1]=2;setvarn(z,vy);
  1046.           }
  1047.         else
  1048.           {
  1049.         if (gcmp0(y)) z=gcopy(y);
  1050.         else
  1051.           {
  1052.             z=cgetg(ly,ty);
  1053.             for (i=2;i<ly;i++)
  1054.               z[i]=lmul(x,y[i]);
  1055.             z[1]=y[1];
  1056.             normalize(&z);
  1057.           }
  1058.           }
  1059.           break;
  1060.           
  1061.         case 13:
  1062.           if(isexactzero(x)) {z=cgetg(2,10);z[1]=2;setvarn(z,vy);}
  1063.           else 
  1064.         {
  1065.           l=avma;z=cgetg(ly,ty);z[1]=lmul(x,y[1]);z[2]=y[2];
  1066.           tetpil=avma;z=gerepile(l,tetpil,gred(z));
  1067.         }
  1068.           break;
  1069.         case 14: 
  1070.           if(isexactzero(x)) {z=cgetg(2,10);z[1]=2;setvarn(z,vy);}
  1071.           else {z=cgetg(ly,ty);z[1]=lmul(x,y[1]);z[2]=lcopy(y[2]);}
  1072.           break;
  1073.           
  1074.         case 17:
  1075.         case 18:
  1076.         case 19: z=cgetg(ly,ty);
  1077.           for (i=1;i<ly;i++) z[i]=lmul(x,y[i]);
  1078.           break;
  1079.           
  1080.         default: err(gmuler1);
  1081.           
  1082.         }
  1083.     }
  1084.       else /* ici ty>=10 et tx>=10 et vx=vy ou tx et ty>=17 */
  1085.     {
  1086.       if((tx>ty)&&((tx<17)||(ty<17)))
  1087.         {
  1088.           p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;
  1089.           tz=lx;lx=ly;ly=tz;
  1090.         }
  1091.       switch(tx)
  1092.         {
  1093.         case 10: switch (ty)
  1094.           {
  1095.           case 10: if (isexactzero(x)||isexactzero(y))
  1096.         {
  1097.           z=cgetg(3,ty);z[1]=2;
  1098.         }
  1099.           else
  1100.         {
  1101.           dx=lgef(x);dy=lgef(y);
  1102.           if (dx<dy)
  1103.             {
  1104.               p1=x;x=y;y=p1;k=lx;lx=ly;ly=k;
  1105.               k=dx;dx=dy;dy=k;
  1106.             }
  1107.           k=dx+dy-3;z=cgetg(k,ty);
  1108.           for (i=2;i<dy;i++)
  1109.             {
  1110.               p1=gzero;l=avma;
  1111.               for (j=2;j<=i;j++)
  1112.             {
  1113.               p2=gmul(y[j],x[i-j+2]);
  1114.               tetpil=avma;
  1115.               p1=gadd(p1,p2);
  1116.             }
  1117.               z[i]=lpile(l,tetpil,p1);
  1118.             }
  1119.           for (i=dy;i<dx;i++)
  1120.             {
  1121.               p1=gzero;l=avma;
  1122.               for (j=2;j<dy;j++)
  1123.             {
  1124.               p2=gmul(y[j],x[i-j+2]);
  1125.               tetpil=avma;
  1126.               p1=gadd(p1,p2);
  1127.             }
  1128.               z[i]=lpile(l,tetpil,p1);
  1129.             }
  1130.           for (i=dx;i<=dx+dy-4;i++)
  1131.             {
  1132.               p1=gzero;l=avma;
  1133.               for (j=i-dx+3;j<dy;j++)
  1134.             {
  1135.               p2=gmul(y[j],x[i-j+2]);
  1136.               tetpil=avma;
  1137.               p1=gadd(p1,p2);
  1138.             }
  1139.               z[i]=lpile(l,tetpil,p1);
  1140.             }
  1141.           z[1]=0x1000000+k;
  1142.         }
  1143.         setvarn(z,vx);normalizepol(&z);
  1144.         break;
  1145.         
  1146.           case 11: if (gcmp0(x))
  1147.         {
  1148.           z=cgetg(3,10);z[1]=2;setvarn(z,vx);
  1149.         }
  1150.           else
  1151.         {
  1152.           if (gcmp0(y))
  1153.             {
  1154.               z=cgetg(3,11);z[1]=0x8000+valp(y)+gval(x,vx);
  1155.               setvarn(z,vx);
  1156.             }
  1157.           else
  1158.             {
  1159.               l=avma;p1=greffe(x,ly);
  1160.               tetpil=avma;p2=gmul(p1,y);
  1161.               z=gerepile(l,tetpil,p2);
  1162.             }
  1163.         }
  1164.         break;
  1165.         
  1166.           case 13:
  1167.           case 14: l=avma;z=cgetg(ly,ty);z[1]=lmul(x,y[1]);
  1168.         z[2]=lcopy(y[2]);
  1169.         if (ty==13)
  1170.           {
  1171.             tetpil=avma;p1=gred(z);z=gerepile(l,tetpil,p1);
  1172.           }
  1173.         break;
  1174.         
  1175.           case 17:
  1176.           case 18:
  1177.           case 19: z=cgetg(ly,ty);
  1178.         for (i=1;i<ly;i++) z[i]=lmul(x,y[i]);
  1179.         break;
  1180.         
  1181.           default: err(gmuler1);
  1182.         
  1183.           } break;
  1184.           
  1185.         case 11: switch (ty)
  1186.           {
  1187.           case 11: if(lx>ly) {k=ly;ly=lx;lx=k;p1=y;y=x;x=p1;}
  1188.         if (gcmp0(x)||gcmp0(y))
  1189.           {
  1190.             z=cgetg(3,11);
  1191.             z[1]=0x8000+valp(x)+valp(y);
  1192.             setvarn(z,vx);
  1193.           }
  1194.         else
  1195.           {
  1196.             l=avma;p1=cgeti(lx);z=cgetg(lx,ty);
  1197.             setvalp(z,valp(x)+valp(y));setvarn(z,vx);setsigne(z,1);
  1198.             for (i=2;i<lx;i++)
  1199.               {
  1200.             /*        p1[i]=!gcmp0(y[i]);z[i]=p1[i]?lmul(x[2],y[i]):zero; */
  1201.             p1[i]=!isexactzero(y[i]);z[i]=p1[i]?lmul(x[2],y[i]):zero;
  1202.               }
  1203.             for(i=3;i<lx;i++)
  1204.               /*          if(!gcmp0(x[i])) */
  1205.               if(!isexactzero(x[i]))
  1206.             for(j=2;j<=lx+1-i;j++)
  1207.               if(p1[j]) z[i+j-2]=ladd(z[i+j-2],gmul(x[i],y[j]));
  1208.             tetpil=avma;z=gerepile(l,tetpil,gcopy(z));
  1209.             normalize(&z);
  1210.           }
  1211.         break;
  1212.         
  1213.           case 13:
  1214.           case 14: if (gcmp0(y))
  1215.         {
  1216.           z=cgetg(3,10);z[1]=2;setvarn(z,vx);
  1217.         }
  1218.           else
  1219.         {
  1220.           if (gcmp0(x))
  1221.             {
  1222.               z=cgetg(3,11);z[1]=0x8000+valp(x)+gval(y,vx);
  1223.               setvarn(z,vx);
  1224.             }
  1225.           else
  1226.             {
  1227.               l=avma;p1=gmul(y[1],x);
  1228.               tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y[2]));
  1229.             }
  1230.         }
  1231.         break;
  1232.         
  1233.           case 17:
  1234.           case 18:
  1235.           case 19: z=cgetg(ly,ty);
  1236.         for (i=1;i<ly;i++)
  1237.           z[i]=lmul(x,y[i]);
  1238.         break;
  1239.         
  1240.           default: err(gmuler1);
  1241.         
  1242.           } break;
  1243.           
  1244.         case 13:
  1245.         case 14: if (ty<=14)
  1246.           {
  1247.         if (tx+ty==26) tz=13;else tz=14;
  1248.         l=avma;z=cgetg(ly,tz);
  1249.         z[1]=lmul(x[1],y[1]);
  1250.         z[2]=lmul(x[2],y[2]);
  1251.         if (tz==13)
  1252.           {
  1253.             tetpil=avma;p1=gred(z);z=gerepile(l,tetpil,p1);
  1254.           }
  1255.           }
  1256.         else
  1257.           {
  1258.         z=cgetg(ly,ty);for(i=1;i<ly;i++)
  1259.           z[i]=lmul(x,y[i]);
  1260.           }
  1261.           break;
  1262.         case 15: if(ty!=15) err(gmuler1);
  1263.           z=compreal(x,y);break;
  1264.           
  1265.         case 16: if(ty!=16) err(gmuler1);
  1266.           z=compose(x,y);break;
  1267.           
  1268.         case 17: switch(ty)
  1269.           {
  1270.           case 17: err(gmuler7);
  1271.         
  1272.           case 18: if (lx!=ly) err(gmuler7);
  1273.           else
  1274.         {
  1275.           z=gzero;l=avma;
  1276.           for (i=1;i<lx;i++)
  1277.             {
  1278.               p1=gmul(x[i],y[i]);
  1279.               tetpil=avma;
  1280.               z=gadd(z,p1);
  1281.             }
  1282.           z=gerepile(l,tetpil,z);
  1283.         }
  1284.         break;
  1285.         
  1286.           case 19: dy=lg(y[1]);
  1287.         if (lx!=dy) err(gmuler8);
  1288.         else
  1289.           {
  1290.             z=cgetg(ly,tx);
  1291.             for (i=1;i<ly;i++)
  1292.               {
  1293.             p1=gzero;l=avma;
  1294.             for (j=1;j<lx;j++)
  1295.               {
  1296.                 p2=gmul(x[j],coeff(y,j,i));
  1297.                 tetpil=avma;
  1298.                 p1=gadd(p1,p2);
  1299.               }
  1300.             z[i]=lpile(l,tetpil,p1);
  1301.               }
  1302.           }
  1303.         break;
  1304.         
  1305.           default: err(gmuler1);
  1306.         
  1307.           } break;
  1308.           
  1309.         case 18: switch(ty)
  1310.           {
  1311.           case 17: z=cgetg(ly,19);
  1312.         for(i=1;i<ly;i++)
  1313.           z[i]=lmul(y[i],x);break;
  1314.         
  1315.           case 18: err(gmuler7);
  1316.         
  1317.           case 19: if(lg(y[1])!=1) err(gmuler7);
  1318.           else
  1319.         {
  1320.           z=cgetg(ly,19);
  1321.           for(i=1;i<ly;i++)
  1322.             z[i]=lmul(coeff(y,1,i),x);
  1323.         }
  1324.         break;
  1325.         
  1326.           default: err(gmuler1);
  1327.         
  1328.           } break;
  1329.           
  1330.         case 19: switch(ty)
  1331.           {
  1332.           case 17: if(lx!=2) err(gmuler7);
  1333.         z=cgetg(ly,19);
  1334.         for(i=1;i<ly;i++)
  1335.           z[i]=lmul(y[i],x[1]);
  1336.         break;
  1337.         
  1338.           case 18: if (lx!=ly) err(gmuler9);
  1339.         if(lx==1) z=gcopy(x);
  1340.         else
  1341.           {
  1342.             dx=lg(x[1]);
  1343.             z=cgetg(dx,ty);
  1344.             for (i=1;i<dx;i++)
  1345.               {
  1346.             p1=gzero;l=avma;
  1347.             for (j=1;j<ly;j++)
  1348.               {
  1349.                 p2=gmul(coeff(x,i,j),y[j]);
  1350.                 tetpil=avma;
  1351.                 p1=gadd(p1,p2);
  1352.               }
  1353.             z[i]=lpile(l,tetpil,p1);
  1354.               }
  1355.           }
  1356.         break;
  1357.         
  1358.           case 19: if(lx==1) err(gmuler10);
  1359.         if(ly==1) z=cgetg(ly,tx);
  1360.         else
  1361.           {
  1362.             dx=lg(x[1]);dy=lg(y[1]);
  1363.             if (lx!=dy) err(gmuler10);
  1364.             z=cgetg(ly,tx);
  1365.             for (i=1;i<ly;i++) z[i]=lgetg(dx,18);
  1366.             for (i=1;i<dx;i++)
  1367.               {
  1368.             for (j=1;j<ly;j++)
  1369.               {
  1370.                 p1=gzero;l=avma;
  1371.                 for (k=1;k<dy;k++)
  1372.                   {
  1373.                 p2=gmul(coeff(x,i,k),coeff(y,k,j));
  1374.                 tetpil=avma;
  1375.                 p1=gadd(p1,p2);
  1376.                   }
  1377.                 coeff(z,i,j)=lpile(l,tetpil,p1);
  1378.               }
  1379.               }
  1380.           }
  1381.         break;
  1382.         
  1383.           default: err(gmuler1);
  1384.         
  1385.           } break;
  1386.           
  1387.         default: err(gmuler1);
  1388.           
  1389.         }     
  1390.     }
  1391.     }
  1392.   return z;
  1393. }
  1394.  
  1395. /********************************************************************/
  1396. /********************************************************************/
  1397. /**                                                                **/
  1398. /**                       DIVISION GENERALE                        **/
  1399. /**                                                                **/
  1400. /********************************************************************/
  1401. /********************************************************************/
  1402.  
  1403. GEN   gdiv(x,y)
  1404.      
  1405.      GEN   x,y;
  1406.      
  1407. {
  1408.   long  lx,ly,lz,l,l1,i,j,s;
  1409.   long  tetpil,tx,ty,tz,vx,vy;
  1410.   GEN z,p1,p2,p3,p4,p5;
  1411.   
  1412.   if (gcmp0(y)) err(gdiver2);
  1413.   else
  1414.     {
  1415.       lx=lg(x);ly=lg(y);tx=typ(x);ty=typ(y);
  1416.       if ((tx<10)&&(ty<10))
  1417.     {
  1418.       switch(tx)
  1419.         {
  1420.         case 1 : switch(ty)
  1421.           {
  1422.           case 1 : l=avma;z=dvmdii(x,y,&p1);
  1423.         if(!signe(p1)) cgiv(p1);
  1424.         else
  1425.           {
  1426.             avma=l;
  1427.             z=cgetg(3,4);z[1]=lcopy(x);
  1428.             z[2]=lcopy(y);
  1429.             if(signe(z[2])<0)
  1430.               {
  1431.             mpnegz(z[1],z[1]);
  1432.             mpnegz(z[2],z[2]);
  1433.               }
  1434.             gredsp(&z);
  1435.           }
  1436.         break;
  1437.         
  1438.           case 2 : z=divir(x,y);break;
  1439.         
  1440.           case 3 : z=cgetg(ly,ty);l=avma;
  1441.         p1= mpinvmod(y[2],y[1]);
  1442.         p2=mulii(x,p1);tetpil=avma;
  1443.         p2=modii(p2,y[1]);
  1444.         z[1]=copyifstack(y[1]);
  1445.         z[2]=lpile(l,tetpil,p2);
  1446.         break;
  1447.         
  1448.           case 4 :
  1449.         
  1450.           case 5 : z=cgetg(ly,ty);
  1451.         z[1]=lmulii(x,y[2]);
  1452.         z[2]=lcopy(y[1]);
  1453.         if(signe(z[2])<0)
  1454.           {
  1455.             mpnegz(z[1],z[1]);
  1456.             mpnegz(z[2],z[2]);
  1457.           }
  1458.         if (ty==4) gredsp(&z);
  1459.         break;
  1460.         
  1461.           case 7 : if(signe(x))
  1462.         {
  1463.           l=avma;p1=cgetp(y);gaffect(x,p1);
  1464.           tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1465.         }
  1466.           else z=gzero;
  1467.         break;
  1468.         
  1469.           case 6 :
  1470.           case 8 : l=avma;p1=gnorm(y);
  1471.         p2=gmul(x,gconj(y));tetpil=avma;
  1472.         z=gerepile(l,tetpil,gdiv(p2,p1));
  1473.         break;
  1474.         
  1475.           case 9 : z=cgetg(ly,ty);l=avma;
  1476.         p1=ginvmod(y[2],y[1]);
  1477.         tetpil=avma;z[2]=lmul(x,p1);
  1478.         gerepile(l,tetpil,1);
  1479.         z[1]=copyifstack(y[1]);
  1480.         break;
  1481.         
  1482.           default: err(gdiver1);
  1483.           } break;
  1484.           
  1485.         case 2 : switch(ty)
  1486.           {
  1487.           case 1 : z=divri(x,y);break;
  1488.           case 2 : z=divrr(x,y);break;
  1489.           case 3 : err(gdiver3);
  1490.           case 4 :
  1491.           case 5 : l=avma;p1=cgetg(lx,tx);gaffect(y,p1);
  1492.         p2=divrr(x,p1);z=gerepile(l,p1,p2);
  1493.         break;
  1494.           case 6 : z=cgetg(ly,ty);l=avma;p1=gnorm(y);
  1495.         p2=gmul(x,y[1]);p3=gmul(x,y[2]);
  1496.         gnegz(p3,p3);tetpil=avma;
  1497.         z[1]=ldiv(p2,p1);
  1498.         z[2]=ldiv(p3,p1);
  1499.         gerepile(l,tetpil,1);
  1500.         break;
  1501.           case 7 : err(gdiver3);
  1502.           case 8 : l=avma;p1=co8(y,lx);tetpil=avma;
  1503.         z=gerepile(l,tetpil,gdiv(x,p1));
  1504.         break;
  1505.           case 9 : z=cgetg(ly,ty);l=avma;
  1506.         p1=ginvmod(y[2],y[1]);
  1507.         tetpil=avma;z[2]=lmul(x,p1);
  1508.         gerepile(l,tetpil,1);
  1509.         z[1]=copyifstack(y[1]);
  1510.         break;
  1511.           default: err(gdiver1);
  1512.           } break;
  1513.         case 3 : switch(ty)
  1514.           {
  1515.           case 1 : z=cgetg(lx,tx);
  1516.         z[2]=lmpinvmod(y,x[1]);l=avma;
  1517.         p1=gmul(x[2],z[2]);
  1518.         mpmodz(p1,x[1],z[2]);avma=l;
  1519.         z[1]=copyifstack(x[1]);
  1520.         break;
  1521.           case 2 : err(gdiver4);
  1522.           case 3 : z=cgetg(ly,ty);
  1523.         if(gegal(x[1],y[1]))
  1524.           z[1]=copyifstack(x[1]);
  1525.         else z[1]=lmppgcd(x[1],y[1]);
  1526.         l=avma;p1=mpinvmod(y[2],z[1]);
  1527.         p2=mulii(x[2],p1);tetpil=avma;
  1528.         z[2]=lpile(l,tetpil,modii(p2,z[1]));
  1529.         break;
  1530.           case 4 : z=cgetg(lx,tx);
  1531.         z[2]=lmpinvmod(y[1],x[1]);
  1532.         l=avma;
  1533.         p1=mulii(x[2],y[2]);
  1534.         mpmodz(p1,x[1],p1);
  1535.         p2=mulii(p1,z[2]);
  1536.         mpmodz(p2,x[1],z[2]);avma=l;
  1537.         z[1]=copyifstack(x[1]);
  1538.         break;
  1539.           case 5 : l=avma;
  1540.         p1=gred(y);tetpil=avma;
  1541.         p2=gdiv(x,p1);z=gerepile(l,tetpil,p2);
  1542.         break;
  1543.           case 6 : 
  1544.           case 8 : l=avma;p1=gnorm(y);p2=gmul(x,gconj(y));tetpil=avma;
  1545.         z=gerepile(l,tetpil,gdiv(p2,p1));break;
  1546.           case 7 : l=avma;p1=cgetg(3,3);p1[1]=x[1];p1[2]=lgeti(lg(x[1]));
  1547.         gaffect(y,p1);tetpil=avma;z=gerepile(l,tetpil,gdiv(x,p1));
  1548.         break;
  1549.           case 9 : z=cgetg(ly,ty);l=avma;
  1550.         p1=ginvmod(y[2],y[1]);
  1551.         tetpil=avma;z[2]=lmul(x,p1);
  1552.         gerepile(l,tetpil,1);
  1553.         z[1]=copyifstack(y[1]);
  1554.         break;
  1555.           default: err(gdiver1);
  1556.           } break;
  1557.         case 4 :
  1558.         case 5 : switch(ty)
  1559.           {
  1560.           case 1 : z=cgetg(lx,tx);z[1]=lcopy(x[1]);
  1561.         z[2]=lmul(x[2],y);
  1562.         if(signe(z[2])<0)
  1563.           {
  1564.             mpnegz(z[1],z[1]);
  1565.             mpnegz(z[2],z[2]);
  1566.           }
  1567.         if (tx==4) gredsp(&z);
  1568.         break;
  1569.           case 2 : l=avma;p1=cgetg(ly,ty);gaffect(x,p1);
  1570.         p2=divrr(p1,y);z=gerepile(l,p1,p2);
  1571.         break;
  1572.           case 3 : z=cgetg(ly,ty);l=avma;
  1573.         p1=mulii(y[2],x[2]);
  1574.         p2=mpinvmod(p1,y[1]);
  1575.         p3=mulii(p2,x[1]);tetpil=avma;
  1576.         z[2]=lmodii(p3,y[1]);
  1577.         gerepile(l,tetpil,1);
  1578.         z[1]=copyifstack(y[1]);
  1579.         break;
  1580.           case 4 :
  1581.           case 5 : if ((tx+ty)==8) tz=4;else tz=5;
  1582.         z=cgetg(ly,tz);
  1583.         z[1]=lmulii(x[1],y[2]);
  1584.         z[2]=lmulii(x[2],y[1]);
  1585.         if(signe(z[2])<0)
  1586.           {
  1587.             mpnegz(z[1],z[1]);
  1588.             mpnegz(z[2],z[2]);
  1589.           }
  1590.         if (tz==4) gredsp(&z);
  1591.         break;
  1592.           case 6 : z=cgetg(ly,ty);l=avma;p1=gnorm(y);
  1593.         p2=gmul(x,y[1]);
  1594.         p3=gmul(x,y[2]);gnegz(p3,p3);
  1595.         tetpil=avma;
  1596.         z[1]=ldiv(p2,p1);
  1597.         z[2]=ldiv(p3,p1);
  1598.         gerepile(l,tetpil,1);
  1599.         break;
  1600.           case 7 : if(signe(x[1]))
  1601.         {
  1602.           l=avma;p1=cgetp(y);gaffect(x,p1);
  1603.           tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1604.         }
  1605.           else z=gzero;
  1606.         break;
  1607.           case 8 : l=avma;
  1608.         p1=gnorm(y);
  1609.         p2=gmul(x,gconj(y));tetpil=avma;
  1610.         z=gerepile(l,tetpil,gdiv(p2,p1));
  1611.         break;
  1612.           case 9 : z=cgetg(ly,ty);l=avma;
  1613.         p1=ginvmod(y[2],y[1]);
  1614.         tetpil=avma;z[2]=lmul(x,p1);
  1615.         gerepile(l,tetpil,1);
  1616.         z[1]=copyifstack(y[1]);
  1617.         break;
  1618.           default: err(gdiver1);
  1619.           } break;
  1620.         case 6 : switch(ty)
  1621.           {
  1622.           case 1 :
  1623.           case 2 :
  1624.           case 3 :
  1625.           case 4 :
  1626.           case 5 : z=cgetg(lx,tx);
  1627.         z[1]=ldiv(x[1],y);
  1628.         z[2]=ldiv(x[2],y);
  1629.         break;
  1630.           case 6 : l=avma;p1=gnorm(y);p2=gconj(y);
  1631.         p3=gmul(x,p2);tetpil=avma;
  1632.         p4=gdiv(p3,p1);
  1633.         z=gerepile(l,tetpil,p4);
  1634.         break;
  1635.           case 7 :
  1636.         if(krosg(-1,y[2])== -1)
  1637.           {
  1638.             z=cgetg(3,6);
  1639.             z[1]=ldiv(x[1],y);
  1640.             z[2]=ldiv(x[2],y);
  1641.           }
  1642.         else
  1643.           {
  1644.             l=avma;p1=cvtop(x,y[2],precp(y));
  1645.             tetpil=avma;
  1646.             z=gerepile(l,tetpil,gdiv(p1,y));
  1647.           }
  1648.         break;
  1649.           case 8 : lx=precision(x);if(!lx) err(gdiver7);
  1650.         l=avma;p1=co8(y,lx);tetpil=avma;
  1651.         z=gerepile(l,tetpil,gdiv(x,p1));
  1652.         break;
  1653.           case 9 : z=cgetg(ly,ty);l=avma;
  1654.         p1=ginvmod(y[2],y[1]);
  1655.         tetpil=avma;z[2]=lmul(x,p1);
  1656.         gerepile(l,tetpil,1);
  1657.         z[1]=copyifstack(y[1]);
  1658.         break;
  1659.           default: err(gdiver1);
  1660.           } break;
  1661.         case 7 : switch(ty)
  1662.           {
  1663.           case 3 : l=avma;p1=cgetg(3,3);p1[1]=y[1];p1[2]=lgeti(lg(y[1]));
  1664.         gaffect(x,p1);tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1665.         break;
  1666.           case 7:
  1667.         if(cmpii(x[2],y[2])) err(gdiver19);
  1668.         if(!signe(x[4])) {z=gcopy(x);setvalp(z,valp(x)-valp(y));}
  1669.         else
  1670.           {
  1671.             p1=(precp(x)>precp(y)) ? y : x;
  1672.             z=cgetp(p1);l=avma;
  1673.             setvalp(z,valp(x)-valp(y));
  1674.             p2=mpinvmod(y[4],p1[3]);
  1675.             modiiz(mulii(x[4],p2),p1[3],z[4]);
  1676.             avma=l;
  1677.           }
  1678.         break;
  1679.           case 6:
  1680.           case 8: l=avma;p1=gmul(x,gconj(y));
  1681.         p2=gnorm(y);tetpil=avma;
  1682.         z=gerepile(l,tetpil,gdiv(p1,p2));
  1683.         break;
  1684.           case 9 : z=cgetg(ly,ty);l=avma;
  1685.         p1=ginvmod(y[2],y[1]);
  1686.         tetpil=avma;z[2]=lmul(x,p1);
  1687.         gerepile(l,tetpil,1);
  1688.         z[1]=copyifstack(y[1]);
  1689.         break;
  1690.           default:
  1691.         l=avma;
  1692.         if(signe(x[4])) p1=cvtop(y,x[2],precp(x));
  1693.         else p1=cvtop(y,x[2],(valp(x)>0)?valp(x):1);
  1694.         tetpil=avma;
  1695.         z=gerepile(l,tetpil,gdiv(x,p1));
  1696.           }
  1697.           break;
  1698.         case 8 : switch (ty)
  1699.           {
  1700.           case 1 :
  1701.           case 3 :
  1702.           case 4 :
  1703.           case 5 : z=cgetg(lx,tx);
  1704.         z[1]=copyifstack(x[1]);
  1705.         for (i=2;i<4;i++)
  1706.           z[i]=ldiv(x[i],y);
  1707.         break;
  1708.           case 2 : l=avma;p1=co8(x,ly);tetpil=avma;
  1709.         z=gerepile(l,tetpil,gdiv(p1,y));
  1710.         break;
  1711.           case 7 : l=avma;p1=cvtop(x,y[2],precp(y));
  1712.         tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1713.         break;
  1714.           case 6 : ly=precision(y);if(!ly) err(gdiver6);
  1715.         l=avma;p1=co8(x,ly);tetpil=avma;
  1716.         z=gerepile(l,tetpil,gdiv(p1,y));
  1717.         break;
  1718.           case 8 : if (!gegal(x[1],y[1])) err(gdiver18);
  1719.         l=avma;p1=gnorm(y);
  1720.         p3=gmul(x,gconj(y));tetpil=avma;
  1721.         z=gerepile(l,tetpil,gdiv(p3,p1));
  1722.         break;
  1723.           case 9 : z=cgetg(ly,ty);l=avma;
  1724.         p1=ginvmod(y[2],y[1]);
  1725.         tetpil=avma;z[2]=lmul(x,p1);
  1726.         gerepile(l,tetpil,1);
  1727.         z[1]=copyifstack(y[1]);
  1728.         break;
  1729.           default: err(gdiver1);
  1730.           } break;
  1731.         case 9 : 
  1732.           if(ty!=9)
  1733.         {
  1734.           z=cgetg(lx,tx);
  1735.           z[2]=ldiv(x[2],y);
  1736.           z[1]=copyifstack(x[1]);
  1737.         }
  1738.           else
  1739.         {
  1740.           z=cgetg(ly,ty);
  1741.           if(gegal(x[1],y[1]))
  1742.             z[1]=copyifstack(x[1]);
  1743.           else z[1]=lgcd(x[1],y[1]);
  1744.           l=avma;p1=ginvmod(y[2],z[1]);
  1745.           p2=gmul(x[2],p1);tetpil=avma;
  1746.           z[2]=lpile(l,tetpil,gmod(p2,z[1]));
  1747.         }
  1748.           break;
  1749.           
  1750.         default: err(gdiver1);
  1751.         }
  1752.     }
  1753.       else
  1754.     {
  1755.       vx=gvar(x);vy=gvar(y);
  1756.       if(((vx<vy)&&((tx<17)||(ty<17)))||((vx==vy)&&(ty<10))||((tx>=17)&&(ty<17)))
  1757.         {
  1758.           l=avma;z=cgetg(lx,tx);
  1759.           switch(tx)
  1760.         {
  1761.         case 9: z[1]=copyifstack(x[1]);z[2]=ldiv(x[2],y);break;
  1762.         case 10: l1=lgef(x);
  1763.           for(i=2;i<l1;i++)
  1764.             z[i]=ldiv(x[i],y);
  1765.           z[1]=x[1];
  1766.           break;
  1767.         case 11:
  1768.           if(gcmp0(x)) z=gcopy(x);
  1769.           else
  1770.             {
  1771.               for(i=2;i<lx;i++)
  1772.             z[i]=ldiv(x[i],y);
  1773.               setvalp(z,valp(x));
  1774.               setvarn(z,vx);
  1775.               normalize(&z);
  1776.             }
  1777.           break;
  1778.         case 13: z[1]=x[1];z[2]=lmul(x[2],y);
  1779.           tetpil=avma;z=gerepile(l,tetpil,gred(z));
  1780.           break;
  1781.         case 14: z[1]=lcopy(x[1]);z[2]=lmul(x[2],y);
  1782.           break;
  1783.         case 17:
  1784.         case 18:
  1785.         case 19: for(i=1;i<lx;i++)
  1786.           z[i]=ldiv(x[i],y);
  1787.           break;
  1788.         default: err(gdiver1);
  1789.         }
  1790.         }
  1791.       else
  1792.         {
  1793.           if((vy<vx)||((vy==vx)&&(tx<10)))
  1794.         switch(ty)
  1795.           {
  1796.           case 9 : z=cgetg(ly,ty);l=avma;
  1797.             p1=ginvmod(y[2],y[1]);
  1798.             tetpil=avma;z[2]=lmul(x,p1);
  1799.             gerepile(l,tetpil,1);
  1800.             z[1]=copyifstack(y[1]);
  1801.             break;
  1802.           case 10:
  1803.             if(lgef(y)>3)
  1804.               {
  1805.             if(isexactzero(x)) 
  1806.               {z=cgetg(2,10);z[1]=2;setvarn(z,vy);}
  1807.             else
  1808.               {
  1809.                 l=avma;z=cgetg(3,13);z[1]=(long)x;
  1810.                 z[2]=(long)y;tetpil=avma;
  1811.                 z=gerepile(l,tetpil,gred(z));
  1812.               }
  1813.               }
  1814.             else z=gdiv(x,y[2]);
  1815.             break;
  1816.           case 11: l=avma;
  1817.             if(gcmp0(x))
  1818.               {
  1819.             p1=ginv(y);tetpil=avma; /* a ameliorer !!!! */
  1820.             z=gerepile(l,tetpil,gmul(x,p1));
  1821.               }
  1822.             else
  1823.               {
  1824.             p1=cgetg(ly,ty);p1[2]=lcopy(x);
  1825.             p1[1]=0x1008000;setvarn(p1,vy);
  1826.             for(i=3;i<ly;i++) p1[i]=zero;
  1827.             tetpil=avma;p2=gdiv(p1,y);
  1828.             z=gerepile(l,tetpil,p2);
  1829.               }
  1830.             break;
  1831.           case 13: l=avma;z=cgetg(ly,ty);z[1]=lmul(x,y[2]);
  1832.             z[2]=y[1];tetpil=avma;z=gerepile(l,tetpil,gred(z));
  1833.             break;
  1834.           case 14: z=cgetg(ly,ty);z[1]=lmul(x,y[2]);z[2]=lcopy(y[1]);
  1835.             break;
  1836.           case 17:
  1837.           case 18: err(gdiver8);
  1838.           case 19: l1=lg(y[1]);
  1839.             if(l1!=ly) err(gdiver9);
  1840.             else
  1841.               {
  1842.             l=avma;
  1843.             p1=invmat(y);tetpil=avma;
  1844.             z=gerepile(l,tetpil,gmul(x,p1));
  1845.               }
  1846.             break;
  1847.           default: err(gdiver1);
  1848.           }
  1849.           else /* ici vx=vy et tx>=10 et ty>=10*/
  1850.         switch(tx)
  1851.           {
  1852.           case 10: switch(ty)
  1853.             {
  1854.             case 10: l=avma;z=cgetg(3,13);
  1855.               z[1]=lcopy(x);z[2]=lcopy(y);tetpil=avma;
  1856.               z=gerepile(l,tetpil,gred(z));
  1857.               break;
  1858.             case 11: if(gcmp0(x))
  1859.               {
  1860.             z=cgetg(3,10);z[1]=2;setvarn(z,vx);
  1861.               }
  1862.             else
  1863.               {
  1864.             l=avma;p1=greffe(x,ly);
  1865.             tetpil=avma;p2=gdiv(p1,y);
  1866.             z=gerepile(l,tetpil,p2);
  1867.               }
  1868.               break;
  1869.             case 13:
  1870.             case 14: l=avma;z=cgetg(ly,ty);
  1871.               z[1]=lmul(x,y[2]);z[2]=(ty==13)?y[1]:lcopy(y[1]);
  1872.               if(ty==13) {tetpil=avma;z=gerepile(l,tetpil,gred(z));}
  1873.               break;
  1874.             case 17:
  1875.             case 18:
  1876.             case 19: err(gdiver10);
  1877.             default: err(gdiver1);
  1878.             } break;
  1879.           case 11: switch(ty)
  1880.             {
  1881.             case 10: l=avma;p1=greffe(y,lx);tetpil=avma;
  1882.               p2=gdiv(x,p1);z=gerepile(l,tetpil,p2);
  1883.               break;
  1884.             case 11: lz=lx;if(ly<lx) lz=ly;
  1885.               if(gcmp0(x))
  1886.             {
  1887.               z=cgetg(3,11);z[1]=0x8000+valp(x)-valp(y);
  1888.               setvarn(z,vx);
  1889.             }
  1890.               else
  1891.             {
  1892.               z=cgetg(lz,ty);p3=cgeti(lz);
  1893.               for(i=3;i<lz;i++) p3[i]=!isexactzero(y[i]);
  1894.               setvalp(z,valp(x)-valp(y));setvarn(z,vx);
  1895.               z[2]=ldiv(x[2],y[2]);
  1896.               for(i=3;i<lz;i++)
  1897.                 {
  1898.                   l=avma;p1=(GEN)(x[i]);
  1899.                   for(j=2;j<i;j++)
  1900.                 if(p3[i-j+2]) p1=gsub(p1,gmul(z[j],y[i-j+2]));
  1901.                   tetpil=avma;p5=gdiv(p1,y[2]);
  1902.                   z[i]=lpile(l,tetpil,p5);
  1903.                 } normalize(&z);
  1904.             }
  1905.               break;
  1906.             case 13:
  1907.             case 14: l=avma;p2=gmul(x,y[2]);tetpil=avma;
  1908.               z=gerepile(l,tetpil,gdiv(p2,y[1]));
  1909.               break;
  1910.             case 17:
  1911.             case 18:
  1912.             case 19: err(gdiver12);
  1913.             default: err(gdiver1);
  1914.             } break;
  1915.           case 13:
  1916.           case 14: switch(ty)
  1917.             {
  1918.             case 10: l=avma;z=cgetg(lx,tx);
  1919.               z[1]=(tx==13)?x[1]:lcopy(x[1]);z[2]=lmul(x[2],y);
  1920.               if(tx==13) {tetpil=avma;z=gerepile(l,tetpil,gred(z));}
  1921.               break;
  1922.             case 11: l=avma;p2=gmul(x[2],y);tetpil=avma;
  1923.               p3=gdiv(x[1],p2);z=gerepile(l,tetpil,p3);
  1924.               break;
  1925.             case 13:
  1926.             case 14: if((tx+ty)==26) tz=13;else tz=14;
  1927.               l=avma;z=cgetg(ly,tz);
  1928.               z[1]=lmul(x[1],y[2]);z[2]=lmul(x[2],y[1]);
  1929.               if(tz==13) {tetpil=avma;z=gerepile(l,tetpil,gred(z));}
  1930.               break;
  1931.             case 17:
  1932.             case 18:
  1933.             case 19: err(gdiver16);
  1934.             default: err(gdiver1);
  1935.             } break;
  1936.           case 15: l=signe(y[2]);setsigne(y[2],-l);s=signe(y[4]);
  1937.             setsigne(y[4],-s);z=compreal(x,y);setsigne(y[2],l);setsigne(y[4],s);
  1938.             break;
  1939.           case 16: l=signe(y[2]);setsigne(y[2],-l);
  1940.             z=compose(x,y);setsigne(y[2],l);break;
  1941.           case 17:
  1942.           case 18:
  1943.           case 19: if(ty<17)
  1944.             {
  1945.               z=cgetg(lx,tx);
  1946.               for(i=1;i<lx;i++)
  1947.             z[i]=ldiv(x[i],y);
  1948.             }
  1949.           else
  1950.             {
  1951.               if((ty==19)&&(lg(y[1])==ly))
  1952.             {
  1953.               l=avma;
  1954.               p1=invmat(y);tetpil=avma;
  1955.               z=gerepile(l,tetpil,gmul(x,p1));
  1956.             }
  1957.               else err(gdiver17);
  1958.             }
  1959.             break;
  1960.           default: err(gdiver1);
  1961.           }
  1962.         }
  1963.     }
  1964.     }
  1965.   return z;
  1966. }
  1967.